package com.xiaoqi.store.service.impl;

import com.xiaoqi.store.dao.UserMapper;
import com.xiaoqi.store.entity.UserEntity;
import com.xiaoqi.store.exception.impl.*;
import com.xiaoqi.store.service.UserService;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.UUID;


/**
 * @Author Rookie Coder
 * @Description
 * @Date
 **/
@Service
@Slf4j
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper userMapper;

    /*
     * @Author xiaoqi
     * @Description 用户注册
     * @return
     **/
    @Override
    public boolean regUser(UserEntity userEntity) {
        // 获取用户注册用户名
        UserEntity loginUsername = userMapper.selectUserByUsername(userEntity.getUsername());
        if (loginUsername != null) {
            log.info("当前用户名重复，被用户已占用 ： " + userEntity.getUsername());
            throw  new UsernameDuplicateException("用户名已被占用");
        }

        String password = userEntity.getPassword();

        // 创建当前日期对象
        Date data = new Date();
        // 盐值
        String salt = UUID.randomUUID().toString().toUpperCase();
        // 对密码进行加密
        String md5Password =getMD5Password(password,salt);
        // 0 代表未删除
        userEntity.setIsDelete(0);
        userEntity.setSalt(salt);
        // 补全数据（四项日志数据）
        userEntity.setPassword(md5Password);
        userEntity.setCreatedTime(data);
        userEntity.setCreatedUser(userEntity.getUsername());
        userEntity.setModifiedTime(data);
        userEntity.setModifiedUser(userEntity.getUsername());
        int insertUserResult = userMapper.insertUser(userEntity);
        // 判断受影响行数
        if (insertUserResult!=1){
            throw new InsertException("添加用户发生未知错误");
        }
        return true;

    }

    /*
    * @Author xiaoqi
    * @Description  对密码进行加密
    * @return String
    **/
    public  String getMD5Password(String password,String salt){

        /*
         * 加密规则：
         * 1、无视原始密码的强度
         * 2、使用UUID作为盐值，在原始密码的左右两侧拼接
         * 3、循环加密3次
         */
        for (int i = 0; i < 3; i++) {
            password = DigestUtils.md5DigestAsHex((salt+password+salt).getBytes()).toUpperCase();
        }
        return password;
    }
    /*
     * @Author xiaoqi
     * @Description  ajax-检查用户名是否重复
     * @return true 或 false
     **/
    @Override
    public boolean checkUserName(String username) {
        return false;
    }

    /*
     * @Author xiaoqi
     * @Description  用户登录
     * @return User
     **/
    @Override
    public UserEntity userLogin(String username, String password) {
        // 根据用户名查询出用户信息
        UserEntity userEntity = userMapper.selectUserByUsername(username);
        // 判断用户是否存在
        if (userEntity == null){
            // 不存在
            throw  new UserNotFondException("请仔细检查用户名密码");
        }
        // 判断用户是否已被删除
        Integer isDelete = userEntity.getIsDelete();
        if (isDelete == 1){
            throw  new UserHasBeanDelete("该用户已被注销");
        }
        // 获取密码比较密码是否相同
        // 获取数据库中的加密密码
        String password1 = userEntity.getPassword();
        // 获取盐值
        String salt = userEntity.getSalt();
        String md5Password = getMD5Password(password, salt);
        // 判断登录密码是否和数据库的密码是否相同
        if (!password1.equals(md5Password)){
            throw  new UserPasswordException("请仔细检查用户名密码");
        }
        else {
            return userEntity;
        }
    }

    /*
    * @Author xiaoqi
    * @Description  修改用户密码
    * @return void
    **/
    @Override
    public void updateUserPassword(Integer uid, String username, String oldPassword, String newPassword) {

        // 先拿到用户的信息
        UserEntity userEntity = userMapper.selectUserByUid(uid);
        if (userEntity == null){
            log.info("用户数据不存在");
            throw new UserNotFondException("用户数据不存在");
        }
        if (userEntity.getIsDelete() == 1){
            log.info("用户已被删除");
            throw new UserNotFondException("用户已被删除");
        }
        // 将用户输入的原密码加密
         String md5Password = getMD5Password(oldPassword, userEntity.getSalt());
        log.info("数据库原密码加密后："+ userEntity.getPassword());
        log.info("输入的原密码加密后："+md5Password);
        String password = userEntity.getPassword();
        // 判断该用户输入的原密码加密后和数据库的密码对比是否正确
        if (!password.equals(md5Password)){
            log.info("原密码输入有误");
            throw  new UserPasswordException("原密码输入有误");
        }
        // 对新密码加密
        String md5NewPassword = getMD5Password(newPassword, userEntity.getSalt());
        // 判断新密码是否与原密码一致
        if (userEntity.getPassword() == md5NewPassword){
            log.info("新密码与原密码一致");
            return;
        }
        // 修改时间
        Date modifyTime = new Date();
        // 用加密后的新密码更新旧密码
        int result = userMapper.updateUserPassword(uid, username, modifyTime, md5NewPassword);
        // 修改失败
        if (result < 1){
            log.info("用户修改密码失败");
            throw new UserPasswordException("用户密码修改失败");
        }
        log.info("用户修改密码成功！！！");

    }

    /*
    * @Author xiaoqi
    * @Description  根据用户ID查找用户信息
    * @return User
    **/
    @Override
    public UserEntity selectUserByUid(Integer uidFromSession) {
        // 根据用户id查找到用户
        UserEntity userEntity = userMapper.selectUserByUid(uidFromSession);
        // 如果用户为null
        if (userEntity == null){
            log.info("用户找不到");
            throw new UserNotFondException("用户找不到");
        }
        if (userEntity.getIsDelete() == 1){
            log.info("用户已被注销");
            throw new UserNotFondException("用户已被注销");
        }
        log.info("用户找到了："+ userEntity);
        return userEntity;
    }

    /*
    * @Author xiaoqi
    * @Description  修改用户信息
    * @return
    **/
    @Override
    public void changeUserInfo(Integer gender,String usernameFromSession, String phone, String email) {

        // 如果用户名和当前登录的用户名不一致:基本不可能发生
//       if (!username.equals(usernameFromSession)){
//           throw new UserNotFondException("用户数据紊乱,请不要篡改系统数据");
//       }
        // 根据用户名查出用户数据
        UserEntity userEntity = userMapper.selectUserByUsername(usernameFromSession);
        if (userEntity.getIsDelete() == 1){
            log.info("用户已被注销");
            throw new UserNotFondException("用户已被注销");
        }
        // 当前修改时间
        Date date = new Date();
        // 修改人
        // 修改用户信息
        int updateResult = userMapper.updateUserInfo(phone, email,gender, date, usernameFromSession);
        // 修改失败
        if (updateResult<=0){
            log.info("用户信息修改失败");
            throw new UserInfoModifyException("用户信息修改失败");
        }
        log.info("用户信息修改成功");
    }


    /*
    * @Author xiaoqi
    * @Description  更新用户图像
    * @return
    **/
    @Override
    public void uploadUserAvator(Integer uid, String avatarPath) {

        // 根据用户uid查询出用户
        UserEntity userEntity = userMapper.selectUserByUid(uid);
        // 判断用户是否存在
        if (userEntity == null){
            throw new UserNotFondException("用户不存在");
        }
        // 判断用户是否被删除
        if (userEntity.getIsDelete() == 1){
            log.info("更新图像时，用户已被注销");
            throw new UserNotFondException("更新图像时，用户已被注销");
        }
        // 修改人
        String username = userEntity.getUsername();
        // 修改时间
        Date  date = new Date();
        // 更新用户图像
        userMapper.updloadUserAvator(uid,avatarPath,date,username);
    }
}
